package com.hatricks.is.base.invokedynamic;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;

/**
 * @packageName: com.hatricks.base.invokedynimac
 * @className: InvokeDynimac
 * @author: yanyuhui y568821795@outlook.com
 * @date: 2023/5/20 18:19
 * @description:
 */
public class InvokeDynamicTest {

    public static void main(String[] args) {
        List<Student> s = new ArrayList<>();
        Student ss = new Student();
        ss.setAge(12);

        Student ss1 = new Student();
        ss1.setAge(13);
        s.add(ss1);
        s.add(ss);

        int num = 15;

        Map<Integer, List<Integer>> collect = s.stream().map(sss1 -> sss1.getAge() * num).map(Function.identity()).collect(Collectors.groupingBy(Integer::intValue));
        System.out.println(collect);

        s.forEach(InvokeDynamicTest::test);
        // 除了方法引用外,类似sss1 -> ss1.getAge()*2 会在本类生成额外方法 进行这个参数2的捕获 然后再constant call site中 仅仅调用对应的调用点  例如 call site 所对应的method handle 方法句柄
        // 在方法句柄调用后 返回asm生成的适配的实例 的对应的 类似 apply方法,在apply方法中 进行当前类中的逻辑调用 （这个方法引用是你在调用申城call site的时候传递进去）

        String result = "zjd";
        testSupplier(() -> ss1.getName());
    }

    public static String getResult() {
        return "zjd";
    }


    public static void testSupplier(Supplier<String> supplier) {
        System.out.println(supplier.get());
    }


    public static void test(Student student) {
        System.out.println(student);
    }


    @Data
    public static class Student {
        private String name;
        private Integer age;


    }

}
